قبل استخدام مختلف إليك بعض الاساسيات البسيطة لترقيم في الحواسيب التي هي من أربع صيغ اساسية:
الترقيم العشري ، التي اساسها 10
الترقيم الثماني ، التي اساسها 8 ، أضافة 0 في بداية العدد للإشارة ان العدد في الميزان ثماني
الترقيم السادس عشر ، التي اساسها 16 ، أضافة 0X او 0x للإشاره ان العدد في الميزان السادس عشر
الترقيم الثنائي ، التي اساسها 2 واضافة 0b للإشاره ان العدد في الميزان الثنائي
0123 # 123 octal (83 decimal) 0x123 # 123 hexadecimal (291 decimal) 0b1010011 # 1010011 binary (83 decimal)
المؤثر DOT تقوم بعملية دمج للنصوص باضافة نص مع نص أخر
#!/usr/bin/perl -w $scalar_str = "Hello "."World\n"; $scalar_int = 42; $scalar_fp = 1.01; print $scalar_str . $scalar_int ."\n".$scalar_fp ;
المؤثر x يستعمل للتكرار مع النصوص شاهد المثال اسفل
print "abc" x 3; # تنتج 'abcabcabc'
#!/usr/bin/perl -w $width = 43; $padding = "\t" x ($width/8) . " " x ($width%8); print $padding;
ويمكن أستخدام المؤثر x مع المصفوفات
@array =(1, 2, 3) x 3;# المصفوفة الان(1, 2, 3, 1, 2, 3, 1, 2, 3) @array2=(@array1) x 3;# @array2الان (1, 2, 3, 1, 2, 3, 1, 2, 3) @columns = (1) x 80; # تنج 80 عنصر بالقيمة 1
كالجمع والطرح والضرب والقسمة وباقي القسمة
#!/usr/bin/perl # The Binary Arithmetic Operators $a = 3 + 5 ; # الجمع $x = 5 - 12; # الطرح $b = 5 * 5; # الضرب $Ex= 2 ** 5 ; # الاس $c = 10 / 2 ; # القسمة $m = 12 % 5; # باقي القسمة print "ADDITION: $a \n"; print "SUBTRACTION: $x \n"; print "MULTIPLICATION: $b\n"; print "EXPONENTS: $Ex \n"; print "DIVISION: $c \n"; print "REMAINDER: $m \n"; # The Unary Arithmetic Operators $p=-14; $n=23; $pp=15 - +$p; #operand +op1 $nn=25 + -$n; #operand -op1 print "Positive operand +op1: $pp \n"; print "Negative operand -op1: $nn \n"; ++$n; #الزيادة بمقدار واحد prefix يزتاد المتغير ثم يعاد --$n; #النقص بمقدار واحد prefix يقل المتغير ثم يعاد $n++; #الزيادة بمقدار واحد postfix يعاد المتغير ثم يزتاد $n--; #النقص بمقدار واحد postfix يعاد المتغير ثم يقل $Square = sqrt(121); # الجذر التربيعي print "The square root of 121 is $Square\n";
التالي عوامل المقارنة بين الأعداد والحروف النصية
| عددي | نصي | الوصف | |
|---|---|---|---|
| == | eq | يساوي | equalty |
| != | ne | لايساوي | INEQUALTY |
| < | lt | أصغر من | LESS THEN |
| > | gt | أكبر من | GREATER THEN |
| <= | le | أصغر من أو يساوي | LESS THEN OR EQUAL |
| >= | ge | أكبر من أو يساوي | GREATER THEN OR EQUQL |
| <=> | cmp | مقارنة بين قيمتين | comparison |
في الحالة الاخيرة تعيد -1 اذا الايسر اصغر من الايمن ، وتعيد 0 اذا كان متساوين ، وتعيد +1 اذا كانت قيمة الايسر اكبر من الايمن
ويمكن استخدم ادوات الشرط للمقارنة الحروف النصية
#!/usr/bin/perl -w
$i = Hello;
if($i eq 'Hello') {
print "Hello!\n";
}
else {
print "The variable (i) doesn't equal the correct string!\n";
}
البيرل تؤفر مؤثرات التخصيص كما في شكل السي والصيغة العامة:
$variable <operator>= $value;
وهي تكافئ تماماً الصيغة
$variable =$variable <operator> $value;
فعلى سبيل المثال
$Count = $Count + 1; $Count += 1 ; # نفس عملية القراءة print "$Count\n";
نفس الامر مع باقي المؤاثرات
| الحسابية | النصوص | الإزاحة | المنطقية | Bitwise |
|---|---|---|---|---|
| += | x= | <<= | ||= | |= |
| -= | .= | >>= | &&= | &= |
| *= | ^= | |||
| /= | ||||
| **= | ||||
| %= |
&& AND # تعيد صواب اذا كان الكل صواب
|| OR # تعيد صواب اذا كان واحد منهما صواب او كليهما
XOR # تعيد صواب اذا واحد منهما فقط صواب
! NOT # تعيد صواب اذا كان غير صواب
العوامل الأربعة لها عوامل علائقية تطبق عليها مثل اكبر > اصغر < اكبر او يساوي >= أقل او يساوي <= يساوي == ولايساوي != وتكون نتيجة تطبيقها إما الصواب true (1) أو الكذب false (0) وتستخدم تلك بكثرة مع ادوات الشرط كما سنرها لاحقاً ان شاء الله
تستخدم العوامل كحروف مثل AND أو رموز && ،واليك المثال التالي لحصول على النتائج المختلفة
#!/usr/bin/perl -w
printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
"Conditional AND (&&)", "false && false", ( 0b0 && 0b0 ),
"false && true", ( 0b0 && 0b1 ),
"true && false", ( 0b1 && 0b0 ),
"true && true", ( 0b1 && 0b1 ) );
printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
"Conditional OR (||)", "false || false", ( 0b0 || 0b0 ),
"false || true", ( 0b0 || 0b1 ),
"true || false", ( 0b1 || 0b0 ),
"true || true", ( 0b1 || 0b1 ) );
printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
"Boolean logical AND (&)", "false & false", ( 0b0 & 0b0 ),
"false & true", ( 0b0 & 0b1 ),
"true & false", ( 0b1 & 0b0 ),
"true & true", ( 0b1 & 0b1 ) );
printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
"Boolean logical inclusive OR (|)",
"false | false", ( 0b0 | 0b0 ),
"false | true", ( 0b0 | 0b1 ),
"true | false", ( 0b1 | 0b0 ),
"true | true", ( 0b1 | 0b1 ) );
printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
"Boolean logical exclusive OR (^)",
"false ^ false", ( 0b0 ^ 0b0 ),
"false ^ true", ( 0b0 ^ 0b1 ),
"true ^ false", ( 0b1 ^ 0b0 ),
"true ^ true", ( 0b1 ^ 0b1 ) );
printf( "%s\n%s: %b\n%s: %b\n", "Logical NOT (!)",
"!false", ( !0b0 ), "!true", ( !0b1 ) );
تستعمل كالدوائر المنطقية حيث تبدل القيمة الى الترميز الثنائي ويتم عملية المقارنة بين كل اثنين بت
& Bitwise AND | Bitwise OR ^ Bitwise XOR ~ Bitwise NOTيستخدم & لوضع قناع MASK يشمل عدة بتات لإستخراجة مرة ثانية لكي يستخدم لغرض خاص، ايضاَ يستخدم في الشرط عندما نريد أختبار مدخل الصفر
unless($var & $var) { }
في المثال السابق استخدام & مع جملة الشرط unless فاذا ادخلنا صفر الى المتغير يدخل الشرط .
ميزات مؤثرات bitwise تتعامل مع النصوص ،فالمقارنة تنجز حرف بواسطة حرف ، وكل حرف لدية ترمز في ASCII والتي تعاد الى الترميز الثنائي فعلى سبيل المثال لإعادة الحرف الكبير الى حرف صغير من خلال المؤثر | مع المسافة ' '، فقيمة المسافة في ASCII هو الاختلاف بين قيمة الحروف الكبيرة مع الحروف الصغيرة
print 'A' | ' '; # produces 'a'
بالنظر الى ترميز ASCII الثنائي هناك بت واحد فقط يختلف بين الحرف الكبير والحرف الصغير لذا من السهولة التحويل بواسطة "or Bitwise"
symbol binary DEC 'A' = 10000001 65 ' ' = 01000000 32 'a' = 11000001 97
الشكل المعاكس لمسافة هي الشرطة التحتية underscore التي هي 10111111 في الثنائي و95 في العشري.
print 'upper' & '_____'; # produces 'UPPER'
وكذلك التعامل مع القيم العددية
print 123 | 456; # produces '507' print '123' | '456'; # produces '577'
القيمة العددية تمثل بقيمة واحدة في الترميز الثنائي
123 = 001111011 456 = 111001000 507 = 111111011
بواسطة علامات الاقتباس تمثل كنص ويمثل العدد بواسطة جدول ASCII والمقارنة تتم من خلال كل رقم مع مايقابلة ، مثلاًُ '1' | '4' تنتج '5'....وكذلك مع باقي الاعداد
هناك مشكلة مع العدد 0 فهو ليس عدد كالاعداد الاخرى مع النصوص ويمثل بايت NULL (فكل نص لة بايت ملغية لتشير الى نهاية هذا النص )اذا كان النص اصغر من الاخرى
print '2000' | '0030'; # produces '2030' #Note that padding is important here. print '2000' | '30'; # produces '3000'
بمقارنة الحرف او البايت الملغية مع العدد الموجود في جدول ASCII
2 = 0110010 0=0110000 0 = 0110000 0=0110000 3 = 0110011 0=0110000 NUL=0000000 3 = 0110011 0=0110000 0 = 0110000 0=0110000
المثال التالي يوضح مختلف مواثرات
#!/usr/bin/perl $a = 3; $b = 6; $r; printf "$a = %03b \n", $a; printf "$b = %03b \n", $b; $r = $a & $b; printf "$a & $b = %03b = %d\n", $r, $r; $r = $a | $b; printf "$a | $b = %03b = %d\n", $r, $r; $r = $a ^ $b; printf "$a ^ $b = %03b = %d\n", $r, $r; $r = ~$a; printf "~$a = %03b = %d\n", $r, $r;
فالدالة printf تقوم بطابعة النص لكنها تنجز العملية الخاصة فعندما تمر الدالة من البارامتر %b فانها تقوم بالطابعة بالترميز الثنائي، وتم استعمال خيار حقل العرض 03 وهو العدد الذي سيخصص كاقصى حقل عرض للبارميتر ، والبارامتر %d يقوم بطباعتها بالعشري ،ملاحظة ان الاعداد تخزن بطول 32 bits بحسب نوع المعالج
3 = 011 6 = 110 3 & 6 = 010 = 2 3 | 6 = 111 = 7 3 ^ 6 = 101 = 5 ~3 = 11111111111111111111111111111100 = -4
مؤثر الازاحة فهي مؤثرات خاصة لمؤاثرات Bitwise
<< مؤثر الازاحة نحو اليسار left shift : يتم اضافة صفر في بداية الoperand وتقوم بدفع البتات الاخرى الى اليسار وفي هذة الحالة تخرج وتلغى البت الاخيرة
>> مؤثر الازاحة نحو اليمين right shift : يتم اضافة صفر في نهاية الoperand وتقوم بدفع البتات الاخرى الى اليمين وفي هذة الحالة تخرج وتلغى البت الاولى
ويمكننا من تحريك كل الـ bits سواء الى اليسار او اليمين التي تفيد في عمليات القسمة او ضرب الأعداد الصحيحة ،نعلم ان الثنائي من عنصرين 0 و 1 لو اردنا القسمة على 2 نزيح القيمة مرة واحدة ولو اردنا القسمة على 4 نزيح مرتين وهكذا
$firstVar = 128;
$secondVar = $firstVar >> 2;
print("$secondVar\n"); # ينتج 32
قبل وبعد الإزاحة حدث التالي عندما تحرك البت من موضع الى موضع اخر ، يخصص المتغير الاول بالقيمة 128 التي تساوي في الترميز الثنائي 10000000 ، بإزاحة هذة القيمة الى مواضعين تصبح القيمة الجديدة 00100000 او 32 في العشري تخصص الى المتغير الثاني secondVar ، البتات المنتقلة نحو اليمين عند الازاحة تفقد وتلغى
مثال اخر بقسمة على 8
$firstVar = 129; # 129 in binary 10000001
$secondVar = $firstVar >> 3;
print("$secondVar\n"); # ينتج 16عند الازاحة نحو اليمين بثلاث مواضع الناتج يصبح 00010000 او 16 وتخصص الى المتغير الثاني ، هكذا نفس الشيء مع ضرب الأعداد الصحيح في 2، 4،8 ، 16 ...بإستبدال الإزاحة نحو اليمين الى اليسار
كالمؤثر , الذي مأخوذ من السي للفصل بين المتغيرات
$var1 = 1, $var2 = $var1;
مؤثرات الشرط ايضاً مأخوذ من السي
$result = ($var == 0) ? 14 : 7;
حيث $var == 0 هنا الشرط فاذا كان الناتج true اوالمتغير يساوي 0 سوف ياخذ القيمة 14 ، واذا كانت النتجية false سوف ياخذ 7 ،هنا نفس المثال بستخدام بنية الشرط if , else
if ($var == 0) {
$result = 14;
} else {
$result = 7;
}
الاسبقية في المؤاثرات
| المؤثرات | Associativity |
|---|---|
| ++, -- | Not applicable |
| -, ~, ! | Right-to-left |
| ** | Right-to-left |
| =~, !~ | Left-to-right |
| *, /, %, x | Left-to-right |
| +, -, . | Left-to-right |
| <<, >> | Not applicable |
| -e, -r, etc. | Left-to-right |
| <, <=, >, >=, lt, le, gt, ge | Left-to-right |
| ==, !=, <=>, eq, ne, cmp | Left-to-right |
| & | Left-to-right |
| |, ^ | Left-to-right |
| && | Left-to-right |
| || | Left-to-right |
| .. | Left-to-right |
| ? and : | Right-to-left |
| =, +=, -=, *=, | Right-to-left |
| , | Left-to-right |
| not | Left-to-right |
| and | Left-to-right |
| or, xor | Left-to-right |